function animate(dom, options , callback ) {
      // 为了特殊处理透明度，我们把透明度当前值和透明度目标点都放大100倍; 
      // - 然后再进行运动; 
      for (var attr in options) {
            var start;
            // 判断特殊的opacity属性进行特殊处理; 
            if( attr === "opacity" ){
                  start = parseInt(getComputedStyle(dom)[attr] * 100);
                  options[attr] = {
                        start: start,
                        // 取出原本的值放入target 属性之中; 
                        target: options[attr] * 100
                  };
            }else{
                  start = parseInt(getComputedStyle(dom)[attr]);
                  options[attr] = {
                        start: start,
                        // 取出原本的值放入target 属性之中; 
                        target: options[attr] 
                  };
            }
      }

      clearInterval(dom.t);
      dom.t = setInterval(function () {
            // 在定时器之中遍历options，进行运动; 
            for (var attr in options) {
                  // target => options[attr].target
                  // start  => options[attr].start
                  var speed = (options[attr].target - options[attr].start) / 10;
                  // - 速度这个玩意不能是小数; 
                  // 对速度进行取整; 
                  // speed = Math.floor( speed );
                  if (speed > 0) {
                        speed = Math.ceil(speed)
                  } else {
                        speed = Math.floor(speed);
                  }

                  // 如何判定所有属性到达目标点; 
                  // - 一个属性到达目标点了那么就删除options里面的这条属性; 

                  if (options[attr].start === options[attr].target) {   
                        // 删除到达目标点的属性; 
                        delete options[attr]
                        // 什么时候该关闭定时器 ? 
                        // options 里面没有属性了就关闭定时器; 
                        // - 对象里面一条属性都没有; 
                        // - for in 这个对象; for in 里面的代码不执行; 
                        // - for in 里面的代码没有执行就关闭定时器; 
                        // - 如果执行就不能关闭定时器; 

                        // 代表for in 里面的代码有没有执行; 
                        var flag = false;
                        
                        for(var attr in options ){
                              // 记录当前代码块是否执行; 
                              flag = true;
                              break;
                        }
                        // flag : false 则表示for in循环没有执行; 
                        
                        if( !flag ){
                              clearInterval( dom.t );
                              if( typeof callback === "function"){
                                    callback();
                              }
                        }
                  } else {
                        // 每次运动都需要让初始值发生改变; 
                        options[attr].start += speed;
                        // 给dom对象赋值; 

                        if(attr === "opacity"){
                              dom.style[attr] = options[attr].start / 100;
                        }else{
                              dom.style[attr] = options[attr].start + "px";
                        }
                  }
            }
      }, 30)
}